GtkBuilder: Enforce "class" as a mandatory attribute for <object>
authorDebarshi Ray <debarshir@gnome.org>
Mon, 18 Sep 2017 16:28:55 +0000 (18:28 +0200)
committerDebarshi Ray <debarshir@gnome.org>
Mon, 25 Sep 2017 13:26:34 +0000 (15:26 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=786931

gtk/gtkbuilderparser.c
testsuite/gtk/builder.c

index da890b42e5c2853397e10055d8583b2f8c90457a..94c5b8b6c1d01332aeab17e8828905e38259691f 100644 (file)
@@ -268,6 +268,12 @@ parse_object (GMarkupParseContext  *context,
       return;
     }
 
+  /* Even though 'class' is a mandatory attribute, we don't flag its
+   * absence here because it's supposed to throw
+   * GTK_BUILDER_ERROR_MISSING_ATTRIBUTE, not
+   * G_MARKUP_ERROR_MISSING_ATTRIBUTE. It's handled immediately
+   * afterwards.
+   */
   if (!g_markup_collect_attributes (element_name, names, values, error,
                                     G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "class", &object_class,
                                     G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "constructor", &constructor,
@@ -279,6 +285,12 @@ parse_object (GMarkupParseContext  *context,
       return;
     }
 
+  if (!object_class)
+    {
+      error_missing_attribute (data, element_name, "class", error);
+      return;
+    }
+
   if (type_func)
     {
       /* Call the GType function, and return the GType, it's guaranteed afterwards
@@ -295,8 +307,10 @@ parse_object (GMarkupParseContext  *context,
           return;
         }
     }
-  else if (object_class)
+  else
     {
+      g_assert_nonnull (object_class);
+
       object_type = gtk_builder_get_type_from_name (data->builder, object_class);
       if (object_type == G_TYPE_INVALID)
         {
@@ -308,11 +322,6 @@ parse_object (GMarkupParseContext  *context,
           return;
        }
     }
-  else
-    {
-      error_missing_attribute (data, element_name, "class", error);
-      return;
-    }
 
   if (!object_id)
     {
index 372bb15e1aca3cdf2907c393809350b19b81b8e0..9d5fb822f363bb16a78ed87371401ff8ecda9d98 100644 (file)
@@ -670,7 +670,7 @@ test_types (void)
     "</interface>";
   const gchar buffer2[] = 
     "<interface>"
-    "  <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
+    "  <object class=\"GtkWindow\" type-func=\"gtk_window_get_type\" id=\"window\"/>"
     "</interface>";
   const gchar buffer3[] = 
     "<interface>"
@@ -678,7 +678,11 @@ test_types (void)
     "</interface>";
   const gchar buffer4[] =
     "<interface>"
-    "  <object type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
+    "  <object class=\"GtkWindow\" type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
+    "</interface>";
+  const gchar buffer5[] =
+    "<interface>"
+    "  <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
     "</interface>";
   GtkBuilder *builder;
   GObject *window;
@@ -707,6 +711,13 @@ test_types (void)
   g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION);
   g_error_free (error);
   g_object_unref (builder);
+
+  error = NULL;
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_string (builder, buffer5, -1, &error);
+  g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_MISSING_ATTRIBUTE);
+  g_error_free (error);
+  g_object_unref (builder);
 }
 
 static void